package com.vencent.spring.java.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 别忘了把这个类扫描进spring上下文
 * 切点方法的参数名字 == 切点表达式的名字 == 通知方法的参数名 都必须要一致
 * 在java中必须使用&&, ||, !
 * 在xml中必须使用and, or, not
 * 
 * 常见的执行表达式：
 * execution(<修饰符>？ <返回值> <方法名模式>(<参数模式>) <异常模式>?) 带问号表示是可选的。
 * 
 * execution(public * *(..))  			所有的公共方法。
 * execution(* *To(..))       			所有类的以To为后缀的方法。
 * execution(*com.Ter.*(..))  			所有Ter接口的所有方法，注意第一个* 和接口名没有空格。
 * execution(*com.Ter+.*(..)) 			所有Ter接口的实现类的所有方法(不止Ter接口定义的)，同样注意第一个*后的空格。
 * execution(* com.tao.*(..)) 			所有com.tao包下的所有的方法。
 * execution(* com.tao..*(..))			所有com.tao包及子包下所有的方法。
 * execution(* com..*.*Dao.find*(..))   所有包名以com为前缀， 类名以Dao为后缀， 方法名以find为前缀的方法。
 * execution(* joke(String,*)))			所有joke方法，参数必须含有两个，第一个为string，第二个不限
 * execution(* joke(String,..))) 		所有joke方法，参数第一个String类型，其他不限。
 * execution(* joke(Object+)))			所有joke方法，参数必须继承或是Object类和其子类的。
 * 
 * @author wbw
 *
 */
@Component
@Aspect
public class TimeCounterAop {
	@Pointcut("execution(* com.vencent.spring.java.bean.Person.playTime(Long)) && args(time)")
	public void timePointCut(Long time){
		
	}
	
	@Around("timePointCut(time)")
	public void timeCounter(ProceedingJoinPoint join, Long time){
		try {
			long begin = System.currentTimeMillis();
			join.proceed();
			long end   = System.currentTimeMillis();
			long s = end - begin;
			System.out.println("方法运行的时间： " + s + "比原来的快: " + (s - time) + "单位(ms)");
		} catch (Throwable e) {
			System.out.println("失败了" + e.getMessage());
		}
	}
}
